package 作用域相关;

import java.util.LinkedHashMap;
import java.util.Map;

public class 类符号 extends 作用域符号 implements 类型 {

    public 类符号(String 名称, 作用域 外围作用域, 类符号 父类) {
        super(名称, 外围作用域);
        this.父类 = 父类;
    }

    public 类符号 父类;

    private final Map<String, 符号> 成员 = new LinkedHashMap<>();

    public 作用域 取父作用域() {
        if (父类 == null) return 外围作用域;
        return 父类;
    }

    public 符号 解析成员(String 成员名) {
        var 符号 = 成员.get(成员名);
        if (符号 != null) return 符号;

        if (父类 != null) {
            return 父类.解析成员(成员名);
        }
        return null;
    }

    @Override
    public Map<String, 符号> 取成员() {
        return 成员;
    }

    public String toString() {
        return "类 " + 名称 + ":{" + 去括号(成员.keySet().toString()) + "}";
    }

    @Override
    public int 取类型索引() {
        return 类型索引.自定义类型.索引;
    }
    
    public boolean 是否是(类型 目标类型){ // !!!! 这个“是否是”是AI取的名字，用于等效英文的“instanceof”!!!起得太好了！！！！
        var 符号 = this;
        while (符号 != null) {
            if (符号 == 目标类型) return true;
            符号 = 符号.父类;
        }

        return false;
    }

    @Override
    public boolean 是否能赋值到(作用域相关.类型 目标类型) {
        return this == 目标类型;
    }
}
